package chapter08.s03threadsych;

/**
 * 同步方法2： 同步方法 synchronized fun(){}
 *   在方法前面同样可以使用synchronized关键字来修饰，被修饰的方法为 同步方法
 *   同步方法 在某一时刻只允许一个线程访问，访问该方法的其他线程都会发生阻塞
 *
 */
// 定义Ticket2类实现Runnable接口
class Ticket2 implements Runnable {
    private int tickets = 10;

    public void run() {
        while (true) {
            saleTicket(); // 调用售票方法
            if (tickets <= 0) {
                break;
            }
        }
    }

    // 定义一个同步方法saleTicket()
    private synchronized void saleTicket() {
        if (tickets > 0) {
            try {
                Thread.sleep(10); // 经过的线程休眠10毫秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "---卖出的票"
                    + tickets--);
        }
    }
}

public class Example12 {
    public static void main(String[] args) {
        Ticket2 ticket = new Ticket2(); // 创建Ticket1对象
        // 创建并开启四个线程
        new Thread(ticket, "线程一").start();
        new Thread(ticket, "线程二").start();
        new Thread(ticket, "线程三").start();
        new Thread(ticket, "线程四").start();
    }
}
